#ifndef IMAGEALGORITHMMANAGER_H
#define IMAGEALGORITHMMANAGER_H

#include <QObject>
#include <QMap>
#include <QString>
#include <QPluginLoader>
#include "ImageProcessingAlgorithmBase.h"

/**
 * @brief 图像算法管理器类
 * 负责加载、初始化和管理各种图像处理算法插件
 * 提供算法注册、参数配置和图像处理完成信号的转发
 */
class ImageAlgorithmManager : public QObject
{
    Q_OBJECT
public:
    /**
     * @brief 构造函数
     * @param parent 父对象指针
     */
    explicit ImageAlgorithmManager(QObject *parent = nullptr);
    
    /**
     * @brief 析构函数
     * 负责清理所有已加载的算法实例和插件加载器
     */
    ~ImageAlgorithmManager();


signals:
    /**
     * @brief 当算法参数设置widget注册完成时发出
     * @param algorithmName 算法名称
     * @param widget 参数设置widget指针，可能为nullptr
     * @param iconPath 算法图标路径
     */
    void algorithmWidgetReady(const QString& algorithmName, QWidget* widget, const QString& iconPath);
    
    /**
     * @brief 当图像处理完成时发出
     * @param imageId 处理完成的图像ID
     * @param processedImage 处理后的图像数据
     * @param algorithmName 使用的算法名称
     * @param isPretreatment 是否是预处理
     */
    void imageProcessingCompleted(const QString& imageId, const QImage& processedImage, const QString& algorithmName,bool isPretreatment);

public slots:
    /**
     * @brief 处理算法参数设置widget注册
     * @param algorithmName 算法名称
     * @param widget 参数设置widget，可为nullptr表示不需要参数设置
     * @param iconPath 算法图标路径
     */
    void onAlgorithmWidgetRegistered(const QString& algorithmName, QWidget* widget, const QString& iconPath);

    /**
     * @brief 初始化管理器
     * 遍历并加载应用程序目录下的图像处理算法DLL插件
     * 默认从应用程序目录下的ImageProcessingAlgorithm文件夹加载
     */
    void initialize();

    /**
     * @brief 获取所有已加载的算法
     * @return 算法名称到算法实例的映射
     */
    QMap<QString, ImageProcessingAlgorithmBase*> algorithms() const;

    /**
     * @brief 根据算法名称获取算法实例
     * @param name 算法名称
     * @return 算法实例指针，若未找到则返回nullptr
     */
    ImageProcessingAlgorithmBase* getAlgorithm(const QString& name) const;

    /**
     * @brief 从指定路径加载算法插件
     * @param dllPath 算法DLL所在目录路径
     */
    void loadAlgorithm(const QString &dllPath);

private:
    /**
     * @brief 存储已加载的算法实例
     * 键为算法名称，值为算法实例指针
     */
    QMap<QString, ImageProcessingAlgorithmBase*> m_algorithms;

    /**
     * @brief 存储插件加载器
     * 键为算法名称，值为插件加载器指针
     */
    QMap<QString, QPluginLoader*> m_loaders;

    /**
     * @brief 存储算法参数设置widget
     * 键为算法名称，值为参数设置widget指针
     */
    QMap<QString, QWidget*> m_algorithmWidgets;
};

#endif // IMAGEALGORITHMMANAGER_H
